// 需要添加头文件 
#include "key_it.h"
#include "uart0.h"
#include "led.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(unsigned int ms);

// irq类型中断处理函数,
// 所有的irq中断都在这个函数中处理


void do_irq(void)
{
	unsigned int irq_num;
	//1 . 获取中断号   GICC_IAR[9:0]  读[9:0]位
    irq_num = 0x3FF & GICC_IAR;

    uart_send_char(irq_num);
	
	switch(irq_num){
	case 86:
        uart_send_string("interrupt no: 86\n");
		// 2. 86号中断的处理程序
		
		// 通过GPIOBDET寄存器对应位的值,
		// 可以判断哪个gpio引脚触发的中断
        if (GPIOB->DET & (0x1 << 8)) 
        {
            uart_send_string("key1 pressed\n");
            
            if (hal_led_get_level(RED)) 
            {
	            hal_gpio_write(RED_PORT, RED, LOW_LEVEL);
            } else {
	            hal_gpio_write(RED_PORT, RED, HIGH_LEVEL);
            }
        }

        if (GPIOB->DET & (0x1 << 16)) 
        {
            uart_send_string("key2 pressed\n");
            if (hal_led_get_level(GREEN)) 
            {
	            hal_gpio_write(GREEN_PORT, GREEN, LOW_LEVEL);
            } else {
	            hal_gpio_write(GREEN_PORT, GREEN, HIGH_LEVEL);
            }
        }
		
		// 3. 清除GPIO层的中断挂起标志位 GPIOBDET[8]			
        GPIOB->DET |= 0x1 << 8;
        GPIOB->DET |= 0x1 << 16;

		// 4. 清除GICD层中断挂起标志位   GICD_ICPENDER2[22]
        GICD_ICPENDER.ICPENDER2 |= 1 << 22;
		break;
	case 87:
		// 87号中断的处理程序
		break;
	default:
		break;

	}
	// 5. 清除中断号  GICC_EOIR[9:0] 将irq_num 写到GICC_EOIR[9:0]位
    GICC_EOIR &= ~(0x3FF);
    GICC_EOIR |= irq_num;
}
